/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package model.handler;

import java.sql.SQLException;
import java.util.LinkedList;
import model.dao.MatrizDAO;
import model.dto.MatrizDTO;
import model.exception.MissingIdException;
import model.exception.NoChangesOnUpdateException;
import model.exception.NotNullFieldsException;

/**
 *
 * @author Gabriel
 */
public class MatrizHandler {

    private MatrizDAO matrizDAO;

    public MatrizHandler() throws SQLException, ClassNotFoundException {
        matrizDAO = new MatrizDAO();
    }

    private void verificaCamposNotNullInsercao(MatrizDTO matrizDTO) throws NotNullFieldsException {
        if (matrizDTO.getIdEspecie() == null) {
            throw new NotNullFieldsException("A Espécie é informação obrigatória de uma Matriz");
        }

        if (matrizDTO.getIdLocal() == null) {
            throw new NotNullFieldsException("O Local é informação obrigatória de uma Matriz");
        }

        if (matrizDTO.getFlgArvoreConjunto() == null) {
            throw new NotNullFieldsException("O Flag De Indicação de Árvore ou Conjunto é informação obrigatória de uma Matriz");
        }
    }

    private void verificaCamposNotNullAtualizacao(MatrizDTO matrizDTO,
                                                  boolean atualizaIdEspecie,
                                                  boolean atualizaIdLocal, 
                                                  boolean atualizaFlgArvoreConjunto) throws NotNullFieldsException {
        if ((matrizDTO.getIdEspecie() == null) && atualizaIdEspecie) {
            throw new NotNullFieldsException("A Espécie é informação obrigatória de uma Matriz");
        }

        if ((matrizDTO.getIdLocal() == null) && atualizaIdLocal) {
            throw new NotNullFieldsException("O Local é informação obrigatória de uma Matriz");
        }

        if ((matrizDTO.getFlgArvoreConjunto() == null) && atualizaFlgArvoreConjunto) {
            throw new NotNullFieldsException("O Flag De Indicação de Árvore ou Conjunto é informação obrigatória de uma Matriz");
        }
    }

    /**
     * Pesquisa uma matriz pelos parâmetros indicados. Pode ser indicado um ou mais parâmetros.
     * @param Id Id da Matriz
     * @param nomeEspecie Nome da Espécie (Científico ou vulgar)
     * @param endereco Endereço da Matriz
     * @param cidade Cidade da Matriz
     * @param estado Estado da Matriz
     * @param bairro Bairro da Matriz
     * @return Retorna lista com resultados encontrados
     * @throws SQLException
     */
    public LinkedList<MatrizDTO> pesquisaMatriz(Integer Id,
            String nomeEspecie,
            String endereco,
            String cidade,
            String estado,
            String bairro) throws SQLException {
        return matrizDAO.pesquisaMatriz(Id, nomeEspecie, endereco, cidade, estado, bairro);

    }

    public void cadastraMatriz(MatrizDTO matrizDTO) throws SQLException, NotNullFieldsException {
        verificaCamposNotNullInsercao(matrizDTO);
        matrizDAO.insereMatriz(matrizDTO);
    }


    public void atualizaMatriz(MatrizDTO matrizDTO,
                               boolean atualizaLocal,
                               boolean atualizaEspecie,
                               boolean atualizaFlgArvoreConjunto) throws MissingIdException, NoChangesOnUpdateException, SQLException, NotNullFieldsException {

        // Verifica se o identificador foi passado
        if (matrizDTO.getId() == null) {
            throw new MissingIdException();
        }
        
        verificaCamposNotNullAtualizacao(matrizDTO, atualizaEspecie, atualizaLocal, atualizaFlgArvoreConjunto);

        if (!(atualizaLocal || atualizaEspecie || atualizaFlgArvoreConjunto)) {
            throw new NoChangesOnUpdateException();
        }

        matrizDAO.atualizaMatriz(matrizDTO, atualizaEspecie, atualizaLocal, atualizaFlgArvoreConjunto);
    }
}
